package framework.util.fileUpload.service;

import framework.util.fileUpload.bo.SysFile;
import framework.util.fileUpload.bo.SysFileModule;
import framework.util.queryFilter.service.IBaseService;
import framework.util.queryFilter.service.impl.QueryFilter;
import org.springframework.web.multipart.MultipartFile;

import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.function.Supplier;

/**
 * 文件上传工具类 <br/>
 * <br>文件上传的通用解决方案：<br/>
 * 1.为了解决文件同名，所以可以用 时间戳文件夹/文件 来存放文件
 * 2.为了防止导出来的war包过大，一般都是将文件保存在服务器本地，而不是存在项目里，所以访问的时候才用Tomcat虚拟路径。
 */
public interface SysFileService extends IBaseService<SysFile, Integer> {

    /**
     * 将multipartFile保存在sysFileModule模块 + fold 的路径下。比如我要生成在uploadTmpFileRootDir\sys_worker\idcard\2019\10\xxxx.jpg， <br/>
     * 而2019\10是当前的年月，这个需要customFold来提供。
     *
     * @param file 要保存的文件
     * @param sysFileModule 当前上传文件所属模块，用来生成保存文件的路径
     * @param uuid 用于如果不为多文件上传的时候，删除旧的文件
     * @param customFoldSupplier 自定义文件夹的生成规则，比如传入： () -> LocalDate.now().getYear() + File.separator;
     * @return 保存的路径
     */
    SysFile upload(MultipartFile file, SysFileModule sysFileModule, String uuid, Supplier<String> customFoldSupplier)  throws Exception;

    /**
     * 将multipartFile保存在sysFileModule模块的路径下
     *
     * @param file 要保存的文件
     * @param sysFileModule 当前上传文件所属模块，用来生成保存文件的路径
     * @param uuid 用于如果不为多文件上传的时候，删除旧的文件
     * @return 保存的路径
     */
    SysFile upload(MultipartFile file, SysFileModule sysFileModule, String uuid) throws Exception;


    /**
     * 批量删除文件
     * @param sysFileLids 待删除的文件的主键，用","分隔
     */
    void deleteFiles(String... sysFileLids);

    /**
     * 获取bo的moduleEname模块的文件
     * @param bo 跟bo关联的文件
     * @param moduleEname 文件的英文模块名
     */
    List<SysFile> getFiles(Object bo, String moduleEname);

    /**
     * 获取bo的moduleEname模块的文件，并且用fileFilter进行过滤文件
     * @param bo 跟bo关联的文件
     * @param moduleEname 文件的英文模块名
     * @param fileFilter 文件过滤器
     */
    List<SysFile> getFiles(Object bo, String moduleEname, QueryFilter fileFilter);


    /**
     * 将sysFile的url转成utf-8编码，防止文件名有特殊字符预览不了
     * @param sysFile
     */
    void encodeURIComponent(SysFile sysFile) throws UnsupportedEncodingException;


}
